#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
struct huff{
    float w;
    char ans;
    huff *l,*r;
};
huff* build()
{
    huff *p=new huff;
    p->l=nullptr;
    p->r=nullptr;
    return p;
}
huff *combine(huff *a,huff *b)
{
    huff *p=build();
    p->w=a->w+b->w;
    p->l=a;p->r=b;
    return p;
}
struct cmp
{
    bool operator() (huff*a,huff*b)
    {
        return a->w>b->w;
    } 
};

//打印字符编码
void uncode(huff *root,string code)
{
    if(root->l==nullptr&&root->r==nullptr)
    {
        cout<<root->ans<<" code "<<code<<endl;
        return;
    }
    uncode(root->l,code+"0");
    uncode(root->r,code+"1");
}

//编码还原
void uncode(huff *root,huff *allroot)
{
    if(root->l==nullptr&&root->r==nullptr) 
    {
        cout<<root->ans;
        root=allroot;
    }
    char ch;ch=cin.get();
    if(ch=='0')
    uncode(root->l,allroot);
    else if(ch=='1')
    uncode(root->r,allroot);
    else return;
}
int main()
{
    int n;cin>>n;huff* allp[n];
    float x;int cnt=0;
    priority_queue<huff*,vector<huff*>,cmp> q;
    for(int i=0;i<n;i++)
    {
        allp[i]=build();
        cin>>allp[i]->w;
        allp[i]->ans=i+'a';
        q.push(allp[i]);
        cin.get();
    }
    huff *root;
    while(q.size()>=2)
    {
        huff *tmp=q.top();q.pop();
        root=combine(tmp,q.top());q.pop();
        q.push(root);
    }
    // cout<<"code end,please enter artical"<<endl;
    uncode(root,"");
    // uncode(root,root);
    return 0;
}



// 0.1 0.2 0.25 0.31 0.33 0.1 0.2 0.3 0.2 0.3 0.5 0.4 0.6 0.7 0.8 0.1 0.32 0.33 0.43 0.23 0.12 0.21 0.12 0.14 0.15 0.16
// 0100101100010111011110

//算导正文例子
// 6
// 45 13 12 16 9 5
//fibonacci例子，得到最长为n-1(对于fibo的前n个数)的编码，且深度递减
// 8
// 1 1 2 3 5 8 13 21
//最大频率小于最小频率的2倍,且编码字符数为2的幂,则huffman树为满二叉树,此时编码效率与定长编码相同
// 11
// 0.1 0.11 0.125 0.134 0.142 0.165 0.175 0.177 0.189 0.192 0.194